﻿/*+===================================================================
File:      PlayState.h

Summary:   Định nghĩa lớp CPlayState .
===================================================================+*/

#include "BaseGameState.h"
#include "Bill.h"
#include "Bullet.h"
#include "QuadTree.h"
#include "Collision.h"
#include "EnemyShelter.h"
#include "EnemySniper.h"
#include "EnemyRun.h"
#include <list>
#include <sstream>
#include <fstream>
#include "Bridge.h"
#include "FlyItemBound.h"
#include "GameInfo.h"
#include "ScoreState.h"
#include "EndState.h"
#include "GameStateManager.h"
#include "GameOverState.h"
#include "StoneFalling.h"
#include "StoneFallingPoint.h"

#ifndef _PLAYSTATE_H_
#define _PLAYSTATE_H_

/*C+==================================================================
Class:    CPlayState

Summary:  Lớp CPlayState là lớp chứa các phương thức của game khi đang
chơi kết thừa từ CBaseGameState.
==================================================================-C*/

class CPlayState : public CBaseGameState
{
private:
	//Đối tượng Bill
	CBill* m_pBill;

	//Đối tượng quản lý tài nguyên
	CResourcesManager* m_pResourcesManager;

	//Đối tượng rootnode của quadtree vẽ
	CQNode* m_pRootNode;

	//Đối tượng rootnode của quadtree collision
	CQNode* m_pCollisionNode;

	//Mảng các đối tượng game
	map<int, CGameObject*> m_aGameObject;

	//Mảng các đối tượng game có body
	map<int, CGameObject*> m_aBGameObject;

	//Danh sách các đối tượng để vẽ
	vector<CGameObject*> m_aObjectToDraw;

	//Danh sách các đối tượng có thể bị va chạm
	vector<CGameObject*> m_aObjectToCollision;

	//Biến texture lưu giá trị của texture để vẽ tile
	CTexture* m_pTexture;

	//Biến texture để vẽ mạng lên màn hình
	CTexture* m_pLifeTexture;

	//Đối tượng âm thanh quản lý nhạc nền
	CSound* m_pSound;

	//Đối tượng quản lý enemy chạy
	CEnemyRun* m_pEnemyRun;

	//Chiều rộng và chiều cao của map
	int m_nMapWidth;
	int m_nMapHeight;

	//Kích thước tile
	int m_nTileSize;

	//Biến kiểm tra hiệu ứng chuyển mà đã chạy xong chưa
	bool m_bChanged;

	//Biến kiểm tra boss đã được sinh chưa
	bool m_bIsBossBorn;
#pragma region Các biến xử lý pixel shader
	//Biến direct device
	LPDIRECT3DDEVICE9 m_pDevice;
	//Biến pixel shader
	IDirect3DPixelShader9* m_pShader;
	//Đo thời gian update map
	float m_fTimeLocal;
	//Đo thời gian chuyển cảnh
	float m_fTimeChange;
	//Đo thời gian kết thúc
	float m_fTimeEnd;
#pragma endregion

	//Ma trận tile
	vector<vector<int>> m_aMatrixTile;

	/*M+==================================================================
	Method:	    CPlayState::Update

	Summary:	Phương thức cập nhật

	Param(s):	deltaTime - thời gian timeFrame
	==================================================================-M*/
	void Update(float deltaTime);

	/*M+==================================================================
	Method:	    CPlayState::Update

	Summary:	Phương thức vẽ
	==================================================================-M*/
	void Render();

	/*M+==================================================================
	Method:	    CPlayState::LoadMap

	Summary:	Phương thức load map
	==================================================================-M*/
	void LoadMap();


public:
	CPlayState();
	~CPlayState();

	void Init();


	//Đối tượng boss
	static CGameObject* m_pObjBoss;

	static vector<CBullet*> s_billBullets;
	static vector<CBullet*> s_enemyBullets;

	//Danh sách các đối tượng enemy chạy
	static CRunningMan* s_enemyRun[MAX_ENEMIES];
	// Vector lưu các đối tượng nằm ngoài quadtree
	// được khi ra do phản ứng trong game.
	static vector<CGameObject*> s_objsOutSideQuadTree;

	void End();
	//Hiệu ứng chuyển màn
	void ChangeScene(float timeFrame);
	//Gán shader
	void SetShader(IDirect3DPixelShader9* shader)
	{
		this->m_pShader = shader;
	}

	//Bill hết mạng, chuyển sang GameOverState
	void GameOver();
};

#endif // _PLAYSTATE_H_

